from sqlalchemy.orm import Session
from sqlalchemy import select, update, delete, insert
from typing import Optional, Dict, List
from app.api.schemas.company import Company_Schema
from app.db.model.company import Company_DB
from sqlalchemy.exc import IntegrityError

# 根据公司信用代码获取公司信息
def get_company_by_creditcode(db: Session, company_creditcode: str):
    try:
        
        if company_creditcode is None:
            # 如果没有提供公司信用代码，则查询所有公司
            # 使用SQLAlchemy的select函数构建查询语句
            stmt = (select(Company_DB).where(Company_DB.del_flag == '0'))
        else:
            # 如果提供了公司信用代码，则查询该公司信用代码对应的公司对象
            # 使用SQLAlchemy的select函数构建查询语句
            stmt = (select(Company_DB).where(Company_DB.creditcode == company_creditcode).where(Company_DB.del_flag == '0'))
        
        res = db.execute(stmt)
        company_list = [Company_Schema(**company.__dict__) for company in res.scalars().all()]
        return company_list
    except Exception as e:
        # 处理异常，例如记录日志或返回错误信息
        print(f"Error fetching company by id: {e}")
        return []
    
# 新增公司信息    
def create_companyinfo(db: Session, company: Company_Schema):
    """
    创建新公司的函数
    :param db: 数据库会话对象，用于与数据库交互。
    :param company: 包含公司信息的 Company_Schema 对象。
    :return: 一个字符串，表示公司创建成功的消息。
    """
    try:
        # 使用SQLAlchemy的insert函数构建插入语句，插入Company_DB表中指定公司信息的公司记录
        stmt = (insert(Company_DB).values(company.model_dump()))
        # 执行插入语句
        db.execute(stmt)
        # 提交数据库会话，将公司对象保存到数据库中
        db.commit()
        return company
    except IntegrityError:
        # 如果发生完整性错误（例如，公司名称已存在），回滚事务并返回错误消息
        db.rollback()
        return "新增公司信息失败"
    except Exception as e:
        # 如果发生其他异常，回滚事务并返回错误消息
        db.rollback()
        return f"新增公司信息失败，发生错误: {str(e)}"

# 更新公司信息    
def update_companyinfo(db: Session, company: Company_Schema):
    """
    更新公司信息的函数
    :param db: 数据库会话对象，用于与数据库交互。
    :param company: 包含公司信息的 Company_Schema 对象。
    :return: 一个字符串，表示公司更新成功的消息。
    """
    try:
        # 使用SQLAlchemy的update函数构建更新语句，更新Company_DB表中指定信用代码的公司记录
        stmt = (update(Company_DB).where(Company_DB.creditcode == company.creditcode).values(company.model_dump()))
        # 执行更新语句
        db.execute(stmt)
        # 提交数据库会话，将更新保存到数据库中
        db.commit()
        # 返回更新后的公司对象
        return company
    except Exception as e:
        # 如果发生异常，回滚事务并返回错误消息
        db.rollback()
        return f"公司更新失败，发生错误: {str(e)}"

# 删除公司信息
def delete_companyinfo(db: Session, creditcode: str):
    """
    删除公司信息的函数
    :param db: 数据库会话对象，用于与数据库交互。
    :param creditcode: 要删除的公司信用代码。
    :return: 一个字符串，表示公司删除成功的消息。
    """
    try:
        # 使用SQLAlchemy的delete函数构建删除语句，删除Company_DB表中指定信用代码的公司记录,逻辑删除
        stmt = (update(Company_DB).where(Company_DB.creditcode == creditcode).values(del_flag='1'))
        # 执行删除语句
        db.execute(stmt)
        # 提交数据库会话，将删除保存到数据库中
        db.commit()
        # 返回删除成功的消息
        return f"信用代码为{creditcode}的公司信息删除成功"
    except Exception as e:
        # 如果发生异常，回滚事务并返回错误消息
        db.rollback()
        return f"公司信息删除失败，发生错误: {str(e)}"